const { ipcRenderer } = require('electron');

Vue.use(ELEMENT);

const app = new Vue({
  el: '#app',
  data: {
    // 视图id
    viewId: null,
    user: {
      headImage: '',
      nickname: '',
    },
    // 窗口是否最大化
    isMaximize: false,
    // 路由
    selectMenu: 'file',
    // 文件列表
    fileList: [],
    // 回收站列表
    recycleList: [],
    // 搜索文件
    searchFile: '',
    // 搜索回收站
    searchRecyc: '',
    // 编辑器映射关系
    fileToView: new Map(),
  },
  methods: {
    // 创建文件
    async createFile() {
      const fileName = (await this.$prompt('请输入文件名称', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputPattern: /^[^ ]+$/,
        inputErrorMessage: '名称不能为空也不能包含空格'
      })).value;
      await createFile(fileName);
      await getFile();
    },
    // 文件重命名
    async renameFile(index) {
      const { value } = await this.$prompt('请输入新文件名称', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        inputPattern: /^[^ ]+$/,
        inputErrorMessage: '名称不能为空也不能包含空格'
      });
      await renameFile(this.fileList[index]._id, value);
      await getFile();
    },
    // 回收文件
    async moveToRecycle(fileId) {
      await recycleFile(fileId);
      await getFile();
    },
    // 恢复文件
    async revertFile(fileId) {
      await revertFile(fileId);
      await getRecycle();
    },
    // 删除文件
    async deleteFile(fileId) {
      await this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      });
      await deleteFile(fileId);
      await getRecycle();
    },
    // 清空回收站
    async clearRecycle() {
      await this.$confirm('此操作将永久删除该文件, 是否继续？', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      });
      await clearRecycle();
      this.recycleList = [];
    },
    // 打开文件编辑器
    async toEdit(file) {
      ipcRenderer.send('toEdit', {
        fileId: file._id,
        explorId: app.viewId,
        viewId: app.fileToView.get(file._id),
      });
      ipcRenderer.send('hide', this.viewId);
    },
    // 最小化
    minimize() {
      this.isMaximize = false;
      ipcRenderer.send('minimize', this.viewId );
    },
    // 最大化
    maximize() {
      this.isMaximize = true;
      ipcRenderer.send('maximize', this.viewId);
    },
    // 取消最大化
    unmaximize() {
      this.isMaximize = false;
      ipcRenderer.send('unmaximize', this.viewId);
    },
    // 退出
    close() {
      ipcRenderer.send('hide', this.viewId);
    },
    // 退出登录
    logout() {
      ipcRenderer.send('logout');
    },
    // 切换路由
    select(index) {
      this.searchFile = '';
      this.searchRecyc = '';
      this.selectMenu = index;
      if (this.selectMenu !== 'setting') {
        getList(this.selectMenu);
      }
    },
    // 退出登录
    logout() {
      ipcRenderer.send('logout');
    },
  }
});

ipcRenderer.on('init', (_event, { nickname, headImage, viewId }) => {
  app.user.nickname = nickname;
  app.user.headImage = headImage;
  app.viewId = viewId;
});

ipcRenderer.on('showMessage', (_event, { leval, message }) => {
  app.$message({
    message,
    type: leval,
  });
});

ipcRenderer.on('changeMaximize', (_event, flag) => {
  app.isMaximize = flag;
});

// 文件打开后记录文件id到视图id的映射关系
ipcRenderer.on('subViewId', (_event, { fileId, viewId }) => {
  app.fileToView.set(fileId, viewId);
});

ipcRenderer.on('editClose', (_event, fileId) => {
  app.fileToView.delete(fileId);
});

getFile();

function getList(selectMenu) {
  switch(selectMenu) {
    case 'file': getFile(); break;
    case 'recycle': getRecycle(); break;
    default: break;
  }
}

/**
 * 获取文件列表
 */
async function getFile() {
  const result = await request('getFile', {
    timeoutMessage: '获取文件请求超时！'
  });
  if (result && result.list) {
    app.fileList = result.list;
  }
}

/**
 * 获取回收站列表
 */
async function getRecycle() {
  const result = await request('getRecycle', {
    timeoutMessage: '获取回收站列表请求超时！'
  });
  if (result && result.list) {
    app.recycleList = result.list;
  }
}

/**
 * 创建文件
 * @param {string} fileName 
 */
async function createFile(fileName) {
  await request('createFile', {
    data: { name: fileName, explorId: app.viewId },
    successMessage: '文件已创建！',
    timeoutMessage: '创建文件请求超时！'
  });
}

/**
 * 文件重命名
 * @param {string} fileId 文件id
 * @param {string} newName 新名称
 */
async function renameFile(fileId, newName) {
  await request('renameFile', {
    data: { fileId, newName, viewId: app.fileToView.get(fileId) },
    successMessage: '重命名成功！',
    timeoutMessage: '重命名请求超时！'
  });
}

/**
 * 回收文件
 * @param {string} fileId 
 */
async function recycleFile(fileId) {
  await request('recycleFile', {
    data: fileId,
    successMessage: '文件已移动至回收站！',
    timeoutMessage: '回收文件请求超时！'
  });
}

/**
 * 恢复文件
 * @param {string} fileId 
 */
async function revertFile(fileId) {
  await request('revertFile', {
    data: fileId,
    successMessage: '文件已恢复！',
    timeoutMessage: '恢复文件请求超时！'
  });
}

/**
 * 删除文件
 * @param {string} fileId 
 */
async function deleteFile(fileId) {
  await request('deleteFile', {
    data: fileId,
    successMessage: '文件已删除！',
    timeoutMessage: '删除文件请求超时！'
  });
}

/**
 * 清空回收站
 */
async function clearRecycle() {
  await request('clearRecycle', {
    successMessage: '回收站已清空！',
    timeoutMessage: '清空回收站请求超时！'
  });
}

function request(router, { data, successMessage, timeoutMessage = '请求超时' }) {
  let timer;
  ipcRenderer.send(router, data);
  return Promise.race([
    new Promise((resolve) => {
      ipcRenderer.once(router + 'Result', (_event, result) => {
        clearTimeout(timer);
        resolve(result);
        if (!result.success) {
          app.$message.error(result.message);
          return;
        }
        if (successMessage) {
          app.$message.success(successMessage);
        }
      });
    }),
    new Promise((resolve) => {
      timer = setTimeout(() =>{
        app.$message.error(timeoutMessage);
        resolve();
      }, 3000);
    }),
  ]);
}